package com.ruoyi.web.controller.system;

import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.RuleConfig;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.IRuleConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 停车规则配置管理控制器
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/system/ruleConfig")
public class RuleConfigController extends BaseController {

    @Autowired
    private IRuleConfigService ruleConfigService;

    /**
     * 获取停车规则配置列表
     */
//    @PreAuthorize("@ss.hasPermi('system:ruleConfig:list')")
    @GetMapping("/list")
    public TableDataInfo list(RuleConfig ruleConfig) {
        startPage();
        List<RuleConfig> list = ruleConfigService.selectRuleConfigList(ruleConfig);
        return getDataTable(list);
    }

    /**
     * 根据规则ID获取详细信息
     */
//    @PreAuthorize("@ss.hasPermi('system:ruleConfig:query')")
    @GetMapping(value = { "/", "/{configId}" })
    public AjaxResult getInfo(@PathVariable(value = "configId", required = false) Long configId) {
        if (StringUtils.isNotNull(configId)) {
            ruleConfigService.checkDataScope(configId); // 数据权限校验（需在Service实现）
        }
        return AjaxResult.success(ruleConfigService.selectRuleConfigById(configId));
    }

    /**
     * 新增停车规则配置
     */
//    @PreAuthorize("@ss.hasPermi('system:ruleConfig:add')")
    @Log(title = "停车规则配置", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody RuleConfig ruleConfig) {
        // 业务校验：规则名称唯一
//        if (!ruleConfigService.checkRuleNameUnique(ruleConfig)) {
//            return error("新增规则'" + ruleConfig.getRuleName() + "'失败，规则名称已存在");
//        }
//        ruleConfig.setCreateBy(SecurityUtils.getUsername());
        return toAjax(ruleConfigService.insertRuleConfig(ruleConfig));
    }

    /**
     * 修改停车规则配置
     */
//    @PreAuthorize("@ss.hasPermi('system:ruleConfig:edit')")
    @Log(title = "停车规则配置", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    public AjaxResult edit(@Validated @RequestBody RuleConfig ruleConfig) {
        ruleConfigService.checkDataScope(ruleConfig.getId()); // 数据权限校验
        // 业务校验：规则名称唯一（修改时排除自身）
        if (!ruleConfigService.checkRuleNameUnique(ruleConfig)) {
            return error("修改规则'" + ruleConfig.getRuleName() + "'失败，规则名称已存在");
        }
        ruleConfig.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(ruleConfigService.updateRuleConfig(ruleConfig));
    }

    /**
     * 删除停车规则配置
     */
//    @PreAuthorize("@ss.hasPermi('system:ruleConfig:remove')")
//    @Log(title = "停车规则配置", businessType = BusinessType.DELETE)
//    @DeleteMapping("/{configIds}")
//    public AjaxResult remove(@PathVariable Long[] configIds) {
//        // 校验是否允许删除（如是否关联其他数据）
//        if (ruleConfigService.hasAssociatedData(configIds)) {
//            return error("所选规则存在关联数据，无法删除");
//        }
//        return toAjax(ruleConfigService.deleteRuleConfigByIds(configIds));
//    }



    /**
     * 分页查询（支持字段模糊查询）
     * 示例：根据规则名称模糊查询
     */
//    @PreAuthorize("@ss.hasPermi('system:ruleConfig:list')")
    @GetMapping("/page")
    public TableDataInfo pageQuery(RuleConfig ruleConfig) {
        startPage();

        List<RuleConfig> list = ruleConfigService.selectRuleConfigList(ruleConfig);

        return getDataTable(list);
    }

    /**
     * 更新规则配置
     */
    @PostMapping("/update")
    public AjaxResult update(@Validated @RequestBody RuleConfig ruleConfig) {
//        规则名称不唯一
//        ruleConfigService.checkDataScope(ruleConfig.getId()); // 数据权限校验
//        // 业务校验：规则名称唯一（修改时排除自身）
//        if (!ruleConfigService.checkRuleNameUnique(ruleConfig)) {
//            return error("修改规则'" + ruleConfig.getRuleName() + "'失败，规则名称已存在");
//        }
//        ruleConfig.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(ruleConfigService.updateRuleConfig(ruleConfig));
    }

    /**
     * 删除规则配置--停车场会使用规则，如果该规则正在被使用，则不能删除
     */
//    @Log(title = "停车规则配置", businessType = BusinessType.DELETE)
//    @DeleteMapping("/{configIds}")
//    public AjaxResult remove(@PathVariable Long[] configIds) {
////        // 校验是否允许删除（如是否关联其他数据）
////        if (ruleConfigService.hasAssociatedData(configIds)) {
////            return error("所选规则存在关联数据，无法删除");
////        }
//        return toAjax(ruleConfigService.deleteRuleConfigByIds(configIds));
//    }

    @DeleteMapping("/delete/{id}")
    public AjaxResult remove(@PathVariable Long id) {
        // 校验规则是否被park_config表引用
        if (ruleConfigService.isRuleUsedByParkConfig(id)) {
            return error("所选规则正在被停车场使用，无法删除");
        }
        return toAjax(ruleConfigService.deleteRuleConfigById(id));
    }


    /**
     * 获取会员计费规则下拉框数据
     * 返回格式: [{"value": 1, "label": "规则名称1"}, {"value": 2, "label": "规则名称2"}]
     */
    @GetMapping("/options")
    public AjaxResult getRuleOptions() {
        // 查询所有未删除的规则配置
        List<RuleConfig> rules = ruleConfigService.selectAllEnabledRules();

        // 转换为下拉框所需格式
        List<Map<String, Object>> options = rules.stream()
                .map(rule -> {
                    Map<String, Object> option = new HashMap<>();
                    option.put("value", rule.getId());       // value 为规则ID
                    option.put("label", rule.getRuleName()); // label 为规则名称
                    return option;
                })
                .collect(Collectors.toList());

        return AjaxResult.success(options);
    }





}
